//
// Description: 5778. 使二进制字符串字符交替的最少反转次数
// Created by Loading on 2021/6/6.
//

#include <bits/stdc++.h>

using namespace std;

int minFlips(string s) {
    int size = s.size();
    //"01" 交替模板
    string template_s = "01";

    //"01" 交替下，需要反转的次数
    int cnt = 0;
    for (int i = 0; i < size; ++i) {
        cnt += s[i] != template_s[i % 2];
    }
    //size - cnt 为 "10" 交替下，需要反转的次数，结果取两者较小值
    int res = min(cnt, size - cnt);
    /*
     * 由于操作类型1是将第一个字符取下，放置于结尾，且可以多次操作，
     * 则将字符串复制一份放置在结尾形成新字符串，
     * 然后使用滑动窗口寻找最小操作次数即可
     */
    s += s;

    for (int i = 0; i < size; ++i) {
        //向右滑动，依次去掉一位并添加一位
        //若去掉的一位是需要反转的一位，则 cnt -= 1;
        cnt -= s[i] != template_s[i % 2];
        //若添加的一位是需要反转的一位，则 cnt == 1;
        cnt += s[i + size] != template_s[(i + size) % 2];
        //取操作后的最小值
        res = min({res, cnt, size - cnt});
    }

    return res;
}

int main() {
    string s = "1110";
    cout << minFlips(s) << endl;
}